﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Application.Creation.Factory_method
{
	public enum TypePizza { Fromage, Chorizo };

	public abstract class Pizzeria
	{
		public Pizza CommanderPizza(TypePizza enType)
		{
			Pizza oPizza = CreerPizza( enType );

			oPizza.Preparer();
			oPizza.Cuire();
			oPizza.Couper();
			oPizza.Emballer();

			return oPizza;
		}

		protected abstract Pizza CreerPizza( TypePizza enType);		
	}

	public class PizzeriaBordeaux : Pizzeria
	{
		protected override Pizza CreerPizza(TypePizza enType)
		{
			Pizza oPizza = null;
			switch (enType)
			{
				case TypePizza.Fromage:
					oPizza = new PizzaFromageStyleBordeaux();
					break;
				case TypePizza.Chorizo:
					oPizza = new PizzaChorizoStyleBordeaux();
					break;
				default:
					break;
			}
			return oPizza;
		}
	}

	public class PizzeriaGembloux : Pizzeria
	{
		protected override Pizza CreerPizza(TypePizza enType)
		{
			Pizza oPizza = null;
			switch (enType)
			{
				case TypePizza.Fromage:
					oPizza = new PizzaFromageStyleGembloux();
					break;
				case TypePizza.Chorizo:
					oPizza = new PizzaChorizoStyleGembloux();
					break;
				default:
					break;
			}
			return oPizza;
		}
	}	

	public abstract class Pizza
	{
		protected string _strNom;
		protected string _strPate;
		protected string _strSauce;

		public virtual void Preparer()
		{
			Console.WriteLine("Préparation de la {0}", _strNom.ToLower());
			Console.WriteLine("Etalage de la {0}", _strPate.ToLower());
			Console.WriteLine("Ajout de la {0}", _strSauce.ToLower());
		}

		public virtual void Cuire()
		{
			Console.WriteLine("Cuisson en 25 mn à 180°");
		}

		public virtual void Couper()
		{
			Console.WriteLine("Découpage en quartier");
		}

		public virtual void Emballer()
		{
			Console.WriteLine("Emballage dans une boite en carton");
		}

	}

	public class PizzaFromageStyleBordeaux : Pizza
	{
		public PizzaFromageStyleBordeaux()
		{
			_strNom		= "Pizza au fromage de Bordeaux";
			_strPate	= "Pate fine";
			_strSauce	= "Sauce au vin";
		}
	}

	public class PizzaChorizoStyleBordeaux : Pizza
	{
		public PizzaChorizoStyleBordeaux()
		{
			_strNom		= "Pizza aux chorizos de Bordeaux";
			_strPate	= "Pate fine";
			_strSauce	= "Sauce au vin";
		}

		public override void Couper()
		{
			Console.WriteLine("Découpage en parts triangulaire");
		}
	}

	public class PizzaFromageStyleGembloux : Pizza
	{
		public PizzaFromageStyleGembloux()
		{
			_strNom = "Pizza fromage de Gembloux";
			_strPate = "Pate épaisse";
			_strSauce = "Sauce à la bière";
		}
	}

	public class PizzaChorizoStyleGembloux : Pizza
	{
		public PizzaChorizoStyleGembloux()
		{
			_strNom = "Pizza chorizo de Gembloux";
			_strPate = "Pate épaisse";
			_strSauce = "Sauce à la bière";
		}

		public override void Couper()
		{
			Console.WriteLine("Découpage en parts carrées");
		}
	}
}
